package weaver.interfaces.gyxy.rabbitmq.util;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.rabbitmq.client.Channel;
import weaver.general.BaseBean;
import weaver.interfaces.gyxy.rabbitmq.config.RabbitMqChannelService;
import weaver.interfaces.gyxy.rabbitmq.model.MqLogMessage;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;


public class SendMessagesUtil extends BaseBean {

    private static final String ex_name = "Wisdom_Portal_Topic_Exchange";
    private static final String instance_rt_name = "com.zfsoft.flow.process_instance.oa";
    private static final String task_rt_name = "com.zfsoft.flow.process_task.oa";
    SimpleDateFormat ft = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");


    /**
     * 发送流程实例
     *
     * @param lcid      流程id （每条流程唯一的ID）
     * @param sxid      事项ID （每个事项唯一的ID）
     * @param sxmc      事项名称
     * @param btsm      标题说明
     * @param sqsj      申请时间 （格式：yyyy-MM-dd HH:mm:ss）
     * @param cxsj      持续时间
     * @param sqr       申请人（教工号或学号）
     * @param url       流程查看地址（填写相对地址，地址前加/）
     * @param source    来源（与routingKey后缀一致）
     * @param status    流程状态
     * @param result    流程结果
     * @param hasmobile 是否有手机表单 (1：有  2：没有)
     * @param mobileurl 手机查看地址（填写相对地址，地址前加/）
     * @param bjsj      办结时间 （格式：yyyy-MM-dd HH:mm:ss）
     */
    public String sendProcessInstance(String lcid, String sxid, String sxmc, String btsm, String sqsj, String cxsj, String sqr,
                                      String url, String source, String status, String result, String hasmobile, String mobileurl, String bjsj) {
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("lcid", lcid);
        jsonObject.put("sxid", sxid);
        jsonObject.put("sxmc", sxmc);
        jsonObject.put("btsm", btsm);
        jsonObject.put("sqsj", sqsj);
        jsonObject.put("cxsj", cxsj);
        jsonObject.put("sqr", sqr);
        jsonObject.put("url", url);
        jsonObject.put("source", source);
        jsonObject.put("status", status);
        jsonObject.put("result", result);
        jsonObject.put("hasmobile", hasmobile);
        jsonObject.put("mobileurl", mobileurl);
        jsonObject.put("bjsj", bjsj);
        //定义消息发送时间戳
        jsonObject.put("fssj", System.currentTimeMillis());
        writeLog(">>>>>sendProcessInstance>>>>jsonObject=" + jsonObject);
        return sendMessage(jsonObject, instance_rt_name);
    }

    /**
     * 发送流程任务
     *
     * @param lcid      流程ID （每条流程唯一的ID）
     * @param jdid      节点ID（当前流程的每个节点唯一的ID）
     * @param btsm      标题说明（当前任务的标题说明）
     * @param bldz      办理地址 （填写相对地址，地址前加/）
     * @param sprs      审批人的数组（["admin"]）
     * @param lcgzdz    流程跟踪地址 （填写相对地址，地址前加/）
     * @param dqjd      当前节点 （当前流程的每个节点唯一的名称）
     * @param syjs      使用角色 （当前审批人使用的角色）
     * @param cyzt      查阅状态 （1:已阅 2：未阅）
     * @param status    任务状态
     * @param result    任务结果
     * @param hasmobile 是否有手机表单（1：有  2：没有）
     * @param mobileurl 手机办理地址 （填写相对地址，地址前加/）
     * @param clsj      任务处理时间 （格式：yyyy-MM-dd HH:mm:ss）
     */
    public String sendProcessTask(String lcid, String jdid, String btsm, String bldz, String[] sprs, String lcgzdz, String dqjd,
                                  String syjs, String cyzt, String status, String result, String hasmobile, String mobileurl, String clsj) {
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("lcid", lcid);
        jsonObject.put("jdid", jdid);
        jsonObject.put("btsm", btsm);
        jsonObject.put("bldz", bldz);
        jsonObject.put("sprs", sprs);
        jsonObject.put("lcgzdz", lcgzdz);
        jsonObject.put("dqjd", dqjd);
        jsonObject.put("syjs", syjs);
        jsonObject.put("cyzt", cyzt);
        jsonObject.put("status", status);
        jsonObject.put("result", result);
        jsonObject.put("hasmobile", hasmobile);
        jsonObject.put("mobileurl", mobileurl);
        jsonObject.put("clsj", clsj);

        //定义消息发送时间戳
        jsonObject.put("fssj", System.currentTimeMillis());
        writeLog(">>>>>sendProcessTask>>>>jsonObject=" + jsonObject);
        return sendMessage(jsonObject, task_rt_name);
    }

    public String sendMessage(JSONObject jsonObject, String routingKey) {
        String messageResult = "";
        String id = UUID.randomUUID().toString();
        //拼装消息内容
        jsonObject.put("uid", id);
        String msg = JSON.toJSONString(jsonObject);

        MqLogMessage mqLogMessage = new MqLogMessage();
        mqLogMessage.setId(id);
        mqLogMessage.setMessages(msg);
        mqLogMessage.setRoutekey(routingKey);
        Date dNow = new Date();
        mqLogMessage.setTime(ft.format(dNow));
        mqLogMessage.setResult("0");
        //消息入库
        writeLog("消息入库：" + mqLogMessage.toString());
        RabbitMqChannelService rabbitMqChannelService = RabbitMqChannelService.getInstance();
        Channel channel = null;
        try {
            channel = rabbitMqChannelService.getChannel();
            channel.basicPublish(ex_name, routingKey, true, null, msg.getBytes("utf-8"));
            if (!channel.waitForConfirms(500L)) {
                mqLogMessage.setResult("1");
                messageResult = "消息发送失败";
            } else {
                messageResult = "消息发送成功";
            }
        } catch (Exception e) {
            e.printStackTrace();
            //标记消息状态
            mqLogMessage.setResult("1");
            mqLogMessage.setReason(e.getMessage());
            messageResult = "消息发送异常";
            writeLog("消息发送失败更新confirm：" + mqLogMessage.toString());
            //插入数据库
        } finally {
            if (null != channel) {
                rabbitMqChannelService.returnChannel(channel);
            }
        }
        return messageResult;
    }
}
